پاراللیسم در سطح دستوری
یکی از ساده ترین شیوههای مورد استفاده برای انجام افزایش پاراللیسم این است که اولین مراحل fetching و decoding دستوری را پیش از اینکه اجرای دستور قبلی تمام شود، شروع کنیم. این روش ساده ترین فرم یک تکنیک بنام instruction pipelining است و در تقریبا تمام سی پی یوهای عمومی جدید استفاده میشود. پایپ لاینینگ، با شکستن مسیر دستوری و تبدیل ان به مراحل جداگانه، باعث میشود تا در هر زمان بیش از یک دستور اجرا شود. این جدا کردن را میتوان با خط مونتاژ مقایسه کرد که در آن یک دستور در هر مرحله کاملتر میشود تا اینکه کامل شود.
با این وجود pipelining ممکن است موقعیتی را بوجود آورد که در آن یافتههای عمل قبلی برای کامل کردن عمل بعدی لازم است. این وضعیت را معمولا آشفتگی ناشی از وابستگی مینامند. برای جلوگیری از این وضعیت، باید توجه بیشتری شود تا در صورت رخ دادن این شرایط بخشی از خط تولید دستوری را به تاخیر اندازیم. بطور طبیعی براورده کردن این شرایط نیازمند مدارهایی اضافهاست، بنابراین پردازندههای pipelined پیچیده تر از انواع ساب اسکیلر هستند (البته نه خیلی چشمگیر). یک پردازندهٔ pipelined میتواند بسیار نزدیک به حد اسکیلر شود، در این شرایط تنها مانع موجود stallها (دستوری که بیش از یک چرخهٔ ساعتی در یک مرحله طول میکشد) هستند. ارتقاء بیشتر در مورد ایدهٔ instruction pipelining منجر به ایجاد روشی شدهاست که زمان خالی اجزای سی پی یو را حتی به میزان بیشتری کاهش میدهد. طراحیهایی که گفته میشود سوپراسکیلر هستند شامل یک خط ایجاد(pipeline) دستور طولانی و واحدهای اجرایی مشابه متعدد هستند. در یک خط ایجاد سوپرسکیلر دستورهای متعددی خوانده شده و به dispatcher (توزیع گر) میروند، توزیع گر تصمیم میگیرد که آیا دستورات مذکور میتوانند بطور موازی (همزمان) اجرا شوند یا نه. در صورتی که پاسخ مثبت باشد، دستورات مذکور به واحدهای اجرایی موجود ارسال (dispatch) میشوند. این کار باعث میشود تا چندین دستور به طور همزمان اجرا شوند. به طور کلی هرقدر یک سی پی یوی سوپرسکیلر بتواند دستورات بیشتری را بطور همزمان به واحدهای اجرایی در حال انتظار ارسال (dispatch) کند، دستورات بیشتری در یک سیکل مشخص اجرا میشوند.
بیشترین دشواری در طراحی یک معماری سوپرسکیلر سی پی یو مربوط به ساخت یک dispatcher موثر است. دیسپچر باید قادر باشد تا به سرعت و بدون اشتباه مشخص کند که آیا دستورات میتوانند بطور موازی اجرا شوند و آنها را به شیوهای ارسال (dispatch) کند تا بیشترین واحدهای اجرایی ممکن را از بیکاری خارج کند. این امر نیازمند این است که خط ایجاد دستوری حداکثر اوقات ممکن پر باشد و معماریهای سوپرسکیلر را نیازمند مقادیر چشمگیری از (cache) میکند. همچنین در این شرایط تکنیکهای پیشگیری از (branch prediction)، (speculative execution) و (out of order execution) برای حفظ سطوح بالای عملکرد ضروری هستند. با تلاش برای پیش بینی اینکه یک دستور شرطی کدام شاخه (یا مسیر) را انتخاب میکند، سی پی یو میتواند تعداد زمانهایی را که تمام خط تولید (pipeline) باید منتظر بماند تا یک دستور شرطی کامل شود به حداقل برساند. اجرای حدسی با اجرای بخشهایی از کد که ممکن است بعد از کامل شدن یک عمل شرطی نیاز نباشند، معمولا موجب افزایش متوسط عملکرد میشود. اجرای خارج از نوبت ترتیبی را که دستورات اجرا میشوند تا حدی دوباره چینی میکند تا تاخیر ناشی از وابستگی اطلاعات را کاهش دهد. همچنین در موارد یک دستور -چند دیتا (Single Instructions Multiple Data) - زمانیکه اطلاعات زیادی از یک نوع باید پردازش شود، پردازندههای جدید میتوانند بخشهایی از خط ایجاد مذکور را غیر فعال کنند، در این حالت زمانیکه یک دستور چند بار اجرا میشود، سی پی یو میتواند از فازهای fetch و decode صرفه نظر کند و بنابراین در موقعیتهای خاصی (خصوصا در موتورهای برنامهای بسیار مونوتون نظیر نرم افزار ایجاد ویدیو و پردازش عکس) به میزان زیادی عملکرد افزایش مییابد.
در مواردی که فقط بخشی از سی پی یو سوپرسکیلر است، بخشی که سوپرسکیلر نیست دچار جبران عملکردی ناشی از وقفههای زمانبندی میشود. Intel P5 Pentium ()دو تا واحد محاسبه و منطق (ALU) سوپرسکیلر داشت که میتوانست یک دستور را به ازای یک clock بپذیرد اما FPUی آن نمیتوانست یک دستور را به ازای یک clock بپذیرد. بنابراین P5 سوپرسکیلر از نوع integer است اما از نوع floating point (ممیز شناور) نیست. جانشین اینتل برای معماری P5، نوع P6 بود که قابلیتهای سوپرسکیلر را به ویژگیهای floating point آن اضافه میکرد و بنابراین موجب افزایش چشمگیری در عملکرد دستوری floating point میشد.
هم طراحی pipeline ساده و هم طراحی سوپر سکیلر موجب میشوند تا یک پردازندهٔ منفرد با سرعتی بیش از یک دستور به ازای یک چرخه (IPC) دستورات را اجرا کند و بدین وسیله ILP ی سی پی یو را افزایش میدهند. بیشتر طراحیهای جدید سی پی یو حداقل تا حدی سوپرسکیلر هستند و تقریبا تمام سی پی یوهای عمومی که در دههٔ اخیر طراحی شدهاند سوپرسکیلر هستند. در سالهای اخیر بخشی از تاکید در طراحی کامپیوترهای ILP بالا از حوزهٔ سخت افزاری سی پی یو خارج شده و در اینترفیس نرم افزاری، یا همان ISA متمرکز شدهاست. استراتژی (VLIW) موجب میشود تا بخشی از ILP بطور مستقیم توسط نرم افزار درگیر شود و بدین وسیله میزان کاری را که سی پی یو باید انجام دهد تا ILP را افزایش دهد (بوست کند) و پیچیدگی طراحی مذکور را کاهش دهد، کم میکند.
پاراللیسم در سطح thread
رویکرد دیگر برای دستیابی به عملکرد، اجرای چندین برنامه یا این رویکرد چندین دستور روی چندین دیتا (MIMD) نام دارد.
یک تکنولوژی که برای این هدف استفاده شد، (MP) نام دارد. چاشنی ابتدایی این نوع تکنولوژی چند پردازشی قرینه(SMP) نام داردکه در آن تعداد محدودی از سی پی یوها یک نمای منسجم از سیستم حافظهٔ خودشان را به اشتراک میگذارند. در این طرح ریزی هر سی پی یو سخت افزاری اضافی برای حفظ یک نمای دائما بروز شده از حافظه دارد. با اجتناب از نماهای کهنه و مانده از سی پی یو، سی پی یوهای مذکور میتوانند روی یک برنامه همکاری کنند و برنامهها میتوانند از یک سی پی یو به دیگری مهاجرت کنند. طرح ریزیهایی نظیر (NUMA) و در دههٔ ۱۹۹۰ ارائه شدند. سیستمهای SMP به تعداد کمی از سی پی یوها محدود میشوند در حالیکه سیستمهای NUMA با هزاران پردازنده موجود هستند. در ابتدای امر، چند پردازشی با استفاده از چندین سی پی یو و صفحهٔ مجزا برای برقراری ارتباط بین پردازندهها ساخته شد. هنگامیکه پردازندهها و ارتباطهای بین آنها تماما روی یک تراشهٔ سیلیکون منفرد سوار شدند، تکنولوژی مذکور ریزپردازندهٔ نام گرفت.
بعدها مشخص شد که finer-grain parallelism با یک برنامهٔ منفرد ایجاد شد. یک برنامهٔ منفرد ممکن است چندین thread (یا عملکرد) داشته باشد که میتوانند بطور جداگانه یا موازی اجرا شوند. برخی از نمونههای ابتدایی این تکنولوژی، پردازش دسترسی مستقیم به حافظه را بعنوان یک thread جداگانه از thread محاسبه بکار گرفتند. یک رویکرد عمومی تر به این تکنولوژی در دههٔ ۱۹۷۰ ارائه شد. در آن زمان سیستمها طوری طراحی شدند تا چندین thread محاسبهای را بطور موازی اجرا کنند. این تکنولوژی (MT)multithreading نام دارد. این رویکرد در مقایسه با چند پردازشی به صرفه تر است زیرا فقط تعداد کمی از اجزا در داخل یک سی پی یو به منظور پشتیبانی از MT تکرار میشوند در حالیکه در MP تمام سی پی یو تکرار میشود. در MT، واحدهای اجرایی و سیستم حافظه منجمله کشها در بین جندین thread به اشتراک گذارده میشوند. عیب MT این است که سخت افزاری که از پشتیبانی میکند در مقایسه با سخت افزاری که از MP پشتیبانی میکند برای نرم افزار قابل دیدن تر است و بنابراین نرم افزارهای ناظر نظیر سیستمهای عامل برای پشتیبانی از MT باید متحمل تغییرات بیشتری شوند. یک نوع از MT که بکار گرفته شد block multithreading نام دارد که در آن اجرای یک thread آغاز میشود و زمانیکه برای بازگشت اطلاعات از حافظهٔ خارجی باید منتظر بماند، دچار توقف عملکرد میشود. در این حالت سی پی یو بلافاصله به thread دیگر که آمادهٔ اجرا است سوویچ میکند. این سوویچ معمولا در یک چرخهٔ کلاک از سی پی یو انجام میگیرد. (simultaneous multithreading) نام دارد که در آن دستورات چندین thread بطور موازی در طی یک چرخهٔ کلاک از سی پی یو اجرا میشوند.
بمدت چندین دهه از ۱۹۷۰ تا ۲۰۰۰، در طراحی سی پی یوهای عمومی دارای عملکرد بالا به میزان زیادی روی دستیابی به ILP بالا از طریق تکنولوژیهایی مثل piplining، کشها، اجرای سوپراسکیلر، اجرای خارج از نوبت و... تاکید میشد. این رویه منجر به طراحی سی پی یوهای بزرگ و پر مصرفی نظیر اینتل پنتیوم ۴ شد. در دههٔ ۲۰۰۰، نابرابری روزافزون بین فرکانسهای عامل سی پی یو و فرکانسهای عامل حافظهٔ اصلی و نیز جدی تر شدن مسالهٔ محو تدریجی پاور سی پی یو (power) بعلت تکنیکهای ILP خیلی نامعمول تر موجب شد تا طراحان سی پی یو دیگر بدنبال افزایش عملکرد با استفاده از تکنیکهای ILP نباشند. پس از آن، طراحان سی پی یو ایدههایی را از بازارهای کامپیوتری تجاری نظیر پردازش دادوستدی که در آن مجموع عملکرد چندین برنامه (پردازش مربوط به کار انجام شده در یک بازهٔ زمانی) مهمتر از عملکرد یک thread یا برنامهاست، به عاریه گرفتند. این تغییر رویکرد میتوان در تکثیر طراحیهای CMP چند هستهای (چند پردازشی در سطح تراشه) و بطور قابل ذکر طراحیهای جدیدتر اینتل که مشابه معماری کمتر سوپرسکیلر
موازی گرایی (پاراللیسم) اطلاعات
یک الگوی غیر معمول اما بطور فزایندهای مهم از سی پی یوها (و در حقیقت، بطور کلی پردازش) مربوط به موازی گرایی اطلاعات است. پردازندههایی که قبلا بحث شدند، تماما انواعی از ابزارهای اسکیلر نامیده میشوند. همچنان که از نام آن پیداست، پردازندههای برداری (vector processors) با چندین قطعه از اطلاعات در زمینهٔ یک دستور سروکار دارند که با پردازندههای اسکیلر که با یک قطعه از اطلاعات برای هر دستور سروکار دارد، متفاوت است. در طبقه بندی Flynn، این دو نوع مواجه با اطلاعات بطور کلی و بترتیب SIMD () و SISD () نامیده میشود. استفادهٔ مهم در ایجاد سی پی یوهایی که با بردارهایی از اطلاعات سرو کار دارند، در بهینه سازی اعمالی است که در آنها یک عمل (برای مثال یک جمع یا dot product)باید روی مجموعهٔ بزرگی از اطلاعات صورت گیرد. برخی از مثالهای کلاسیک این نوع از اعمال کاربردهای
نظرات شما عزیزان: